模型属性

译者:飞龙

来源:Model Properties

模型和一些关联具有一个或多个属性,每个属性有类型以及一些可选设置,你可以自行选择它们(或使用默认设置)。

类型

受支持的类型是:

  • text:文本字符串;
  • number:浮点数。你可以指定size2 | 4 | 8
  • integer:整数。你可以指定size2 | 4 | 8
  • booleantruefalse的值;
  • date:日期对象。你可以指定timetrue
  • enum:一个备选列表中的值;
  • object:JSON对象;
  • point:N维的点(不被广泛支持);
  • binary:二进制数据;
  • serial:自增长的整数,用于主键。

每个类型都有额外的选项。这个模型定义使用了它们中的绝大多数:

  1. var Person = db.define("person", {
  2. name : { type: "text", size: 50 },
  3. surname : { type: "text", defaultValue: "Doe" },
  4. male : { type: "boolean" },
  5. vat : { type: "integer", unique: true },
  6. country : { type: "enum", values: [ "USA", "Canada", "Rest of the World" ] },
  7. birth : { type: "date", time: false }
  8. });

所有类型都支持required(布尔值),unique(布尔值)和defaultValue(文本)。文本类型也支持最大尺寸(数值)和big(布尔值,用于非常长的字符串)。数值类型是浮点数,支持size(数值,字节大小)和unsigned(布尔值)。日期类型支持time(布尔值)。

要注意8字节的数值有其局限性

如果你打算用默认选项,你可以使用原生类型来指定属性类型:

  1. var Person = db.define("person", {
  2. name : String,
  3. male : Boolean,
  4. vat : Number, // FLOAT
  5. birth : Date,
  6. country : [ "USA", "Canada", "Rest of the World" ],
  7. meta : Object, // JSON
  8. photo : Buffer // binary
  9. });

将ORM字段映射到不同名称的数据库列中

  1. var Person = db.define("person", {
  2. name : { type: 'text', mapsTo: 'fullname' }
  3. });

ORM属性name映射person表的fullname列。

自定义类型

你可以向ORM添加你自己的类型,像这样:

  1. db.defineType('numberArray', {
  2. datastoreType: function(prop) {
  3. return 'TEXT'
  4. },
  5. // This is optional
  6. valueToProperty: function(value, prop) {
  7. if (Array.isArray(value)) {
  8. return value;
  9. } else {
  10. return value.split(',').map(function (v) {
  11. return Number(v);
  12. });
  13. }
  14. },
  15. // This is also optional
  16. propertyToValue: function(value, prop) {
  17. return value.join(',')
  18. }
  19. });
  20. var LottoTicket = db.define('lotto_ticket', {
  21. numbers: { type: 'numberArray' }
  22. });

一些可用的高级自定义类型,能够让你像 PostGIS 那样使用模型。请见这个 spec